import Vue from 'vue'


/**
 * 事件分发管理器，一个监听者模式的单利类
 */
const EventManager = {}
//监听器
const sys_listeners = [];


//系統級的事件
EventManager.window_resize = "window_resize"

/**
 * @param {Object} 使用类的this指向
 * @param {Object} 事件名称
 * @param {Object} 回调函数
 */
EventManager.addListener = function(lthis, eventname, callback) { // lthis 调用者 eventname 就是字段 callback
	//把这个监听器 添加到监听器队列
	let listener = {
		name: eventname, //这个页面监听什么字段
		fun: callback, //回调函数
		lthis: lthis //页面对象
	}
	sys_listeners.push(listener)
	return listener;
}


//删除监听器
EventManager.removeListener = function(listener) {
	for (var index in sys_listeners) {
		if (sys_listeners[index] == listener) {
			sys_listeners.splice(index, 1);
			break;
		}
	}
}

//删除某个对象的所有监听器
EventManager.removeMyListener = function(lthis) {
	for (var index = sys_listeners.length; --index >= 0;) {
		if (sys_listeners[index].lthis == lthis) {
			sys_listeners.splice(index, 1);
		}
	}
}

//notify 通知的监听器 
EventManager.Notify = function(tag, data) {
	for (var index in sys_listeners) {
		if (sys_listeners[index].name == tag) {
			//如果有某个监听器声称处理了这个事件  就不在继续传递了
			if (sys_listeners[index].fun.apply(sys_listeners[index].lthis, [data])) {
				break;
			}
		}
	}
}

/**
 * 监听事件
 * @param {String} eventname
 * @param {function} callback
 */
Vue.prototype.$onEvent = function(eventname, callback) {
	//注册监听
	let Listener = EventManager.addListener(this, eventname, callback)
	//
	// if (!this._SYS_REMOVE_TAG) {
	// 	this._SYS_REMOVE_TAG = true;
		
	// }
	if(this.$once)
	{
		this.$once('hook:beforeDestroy', function() {
			EventManager.removeMyListener(this);
			// console.log("removelistener")
		})
	}
}

//发送事件
Vue.prototype.$sendEvent = function(eventname, data) {
	EventManager.Notify(eventname, data)
}

window.onresize = ()=>{

	EventManager.Notify(EventManager.window_resize)
}

export default EventManager
